package liecai_class.day07;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池 - 关闭
 * shutdown()
 *  正常关闭线程池：
 *      1.不再接收新的任务
 *      2.等待线程池中的任务都执行完毕
 *      3.关闭线程池中的线程
 *      4.关闭线程池
 *   不能保证立即关闭线程池，但能保证所有的任务都安全的执行完成
 * shutdownNow()
 *   立即关闭线程池:
 *      1.不再接收新的任务
 *      2.尝试终止正在执行的任务
 *      3.关闭线程池中的线程
 *      4.关闭线程池
 *    尽力的去立即关闭线程池，但不能保证真的立即关闭，因为有些线程是无法被终止的
 *    此外，还有可能造成一些无法预估的意外的损害
 *    所以，除非迫不得已，否则不要使用此方法
 */
public class Demo03 {
    public static void main(String[] args) {
        // 创建线程池对象
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                5,
                10,
                10,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(5),
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        System.out.println("###线程池过于繁忙，拒绝服务###"+r);
                    }
                }
        );

        pool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("任务1执行开始");
                    Thread.sleep(3000);
                    System.out.println("任务1执行完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        });

        //关闭线程池
        pool.shutdown();
        //pool.shutdownNow();
    }
}
